package it.unisa.unibox.gestioneProdotti;



import it.unisa.unibox.beans.AltroProdotto;
import it.unisa.unibox.beans.Ricercatore;
import it.unisa.unibox.commons.DBConstants;
import it.unisa.unibox.commons.DBNames;
import it.unisa.unibox.commons.XMLParser;
import it.unisa.unibox.facade.FacadeProdotti;
import it.unisa.unibox.facade.IFacadeProdotti;
import it.unisa.unibox.otherServlets.UtilityFunctions;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jdom.Document;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

/**
 * Servlet implementation class LoginServlet
 */
public class InserisciAltroProdottoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public static ServletContext servletContext;

	private String filePath;


	public static IFacadeProdotti facade;


	public InserisciAltroProdottoServlet() {
		super();
	}

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		try {
			super.init(config);			
			servletContext = getServletConfig().getServletContext();
			filePath = servletContext.getRealPath("files");
			facade = new FacadeProdotti();

		} 

		catch (Exception e) {
			e.printStackTrace();
		}
	}


	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		doPost(request,response);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		int stato = -1;
		int idProdotto=0;
		
		AltroProdotto prodotto = creaBean(request);
		if(prodotto!=null){
				
				if(facade.checkConflitto(0,request.getParameter(DBNames.ATT_PRODOTTO_TITOLO), 
						request.getParameter(DBNames.ATT_PRODOTTO_TIPOLOGIA), 
						Integer.parseInt(request.getParameter(DBNames.ATT_PRODOTTO_ANNO)),
						request.getParameter(DBNames.ATT_PRODOTTO_URL))){
					
						stato = 0;
						System.out.println("conflitto trovato");
				}
				
	
				idProdotto = facade.inserisciProdotto(prodotto);	
	
				String autori = request.getParameter("autori");
				
				System.out.println("autori prima: \n"+ autori);
				ArrayList<Integer> lista = UtilityFunctions.mySplit(autori);
				System.out.println("autori dopo: \n"+ lista.toString());
				Ricercatore rc = (Ricercatore) request.getSession().getAttribute("ricercatore");
		
				if(facade.aggiornaListaAutori(idProdotto, lista, rc.getId())){
					if(stato != 0)
						stato = 1;
				}
				else
					stato = -1;
			}
		else{
			stato = -1;
		}
		
		System.out.println("id"+idProdotto+" stato"+stato);
		Document doc = XMLParser.rispostaInserimento(idProdotto, stato);
		XMLOutputter xml_out = new XMLOutputter();
		xml_out.setFormat(Format.getPrettyFormat());
		response.setContentType("text/xml");
		response.setHeader("Cache-Control",	"no-store, no-cache, must-revalidate");     
		PrintWriter out = response.getWriter(); 
		// test --> xml_out.output(doc, new FileOutputStream(new File("prova.xml")));
		xml_out.output(doc, out);
			
	}
		
	

	protected AltroProdotto creaBean(HttpServletRequest request){


		AltroProdotto p = null;


		String titolo = request.getParameter(DBNames.ATT_PRODOTTO_TITOLO);
		String abstract_field = request.getParameter("abstract_field");
		int anno = Integer.parseInt(request.getParameter(DBNames.ATT_PRODOTTO_ANNO));
		String lingua = request.getParameter(DBNames.ATT_PRODOTTO_LINGUA);  
		String url = request.getParameter(DBNames.ATT_PRODOTTO_URL); 
		String note = ""; 


		String tipologia = request.getParameter(DBNames.ATT_PRODOTTO_TIPOLOGIA);
		int stato = request.getParameter(DBNames.ATT_PRODOTTO_STATO)==null ? DBConstants.PRODOTTO_STATO_DRAFT : DBConstants.PRODOTTO_STATO_COMPLETO;
		int pubblico = request.getParameter(DBNames.ATT_PRODOTTO_PUBBLICO).equalsIgnoreCase("si") ? DBConstants.PRODOTTO_DOMINIO_PUBBLICO : DBConstants.PRODOTTO_DOMINIO_PRIVATO;
		System.out.println("->>>> "+request.getParameter(DBNames.ATT_PRODOTTO_ANNO));

		String descrizione = request.getParameter("descrizione");  

	//	int idProdotto = Integer.parseInt(request.getParameter("id"));



		if(!UtilityFunctions.controllaCampi(titolo, abstract_field, anno, lingua, url) 
				|| !controllaCampiAltro(descrizione) )
			return p;
		else
			p = new AltroProdotto(0,(Ricercatore) request.getSession().getAttribute("ricercatore"),
					tipologia,
					titolo, 
					abstract_field,
					stato,
					pubblico,
					anno,
					lingua,
					url,
					note,
					descrizione); 

		System.out.println(p);

		return p;
	}


	private static boolean controllaCampiAltro(String descrizione){
		if(descrizione.length() < 1 || descrizione.length() > 120 || descrizione.equals("")){
			return false;
		}
		return true;
	}


}
